Fish Shell 简明教程

Posted by Forgus on 2022-08-09

简介

Fish (Friendly Interactive Shell) 是一款智能化的命令行 shell,语法简洁、功能强大、支持自动补全。

安装

1
2
3
4
5
# Ubuntu/Debian
sudo apt install fish

# macOS
brew install fish

基础语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 变量
set name "Tom"
echo $name

# 条件
if test $name = "Tom"
echo "Hello Tom"
else
echo "Hello stranger"
end

# 循环
for i in (seq 5)
echo $i
end

# 函数
function greet
echo "Hello $argv"
end
greet "World"

常用命令

1
2
3
4
5
6
7
8
# 查看文件
cat, less, head, tail

# 查找文件
find . -name "*.txt"

# 进程管理
ps, kill, top

快捷键配置

使用 bind 命令

1
2
3
4
5
6
7
8
# 查看现有绑定
bind --list

# 绑定快捷键
bind \cr history-search-backward # Ctrl+R 反向搜索历史
bind \cf forward-search-history # Ctrl+F 正向搜索历史
bind \cp up-or-search # Ctrl+P 上浏览历史
bind \cn down-or-search # Ctrl+N 下浏览历史

配置文件方式

~/.config/fish/config.fish 中添加绑定:

1
2
3
4
5
6
7
8
9
# ~/.config/fish/config.fish
bind \cr history-search-backward
bind \cf forward-search-history
bind \cp up-or-search
bind \cn down-or-search

# Alt+方向键 按词跳转
bind \e\[C forward-word
bind \e\[D backward-word

自定义函数方式

~/.config/fish/functions/ 创建 fish_user_key_bindings.fish

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function fish_user_key_bindings
# 基础快捷键
bind \cr history-search-backward
bind \cf forward-search-history

# 方向键
bind \e\[A history-search-backward
bind \e\[B history-search-forward
bind \e\[C forward-word
bind \e\[D backward-word

# Ctrl+方向键
bind \e\[1\;5C forward-word
bind \e\[1\;5D backward-word
end

常用快捷键

快捷键 功能
Ctrl+R 反向搜索历史
Ctrl+P/N 上/下浏览历史
Alt+←/→ 按词跳转
Ctrl+←/→ 按词跳转(部分终端)
Ctrl+C 终止当前命令
Ctrl+Z 暂停当前命令 (fg 恢复)
Ctrl+L 清屏
Ctrl+A/E 行首/行尾

插件管理

使用 Fisher 插件管理器:

1
2
3
4
5
6
# 安装 Fisher
curl -sL https://git.io/fisher | source && fisher install jorgebucaran/fisher

# 安装插件
fisher install jorgebucaran/nvm.fish
fisher install oh-my-fish/theme-bobthefish

自动补全

Fish 自动提供:

  • 命令参数补全
  • 文件路径补全
  • Git 子命令补全
  • apt/dnf/yum 包名补全

手动补全文件位置:~/.config/fish/completions/

实用技巧

1
2
3
4
5
6
7
8
9
10
11
# 设置别名
alias ll 'ls -lah'

# 查看函数定义
functions function_name

# 查看变量
echo $PATH

# 导出变量
export EDITOR "vim"

配置生效

修改 config.fish 后不需要重启 shell,Fish 会自动加载。

如需手动重载:

1
source ~/.config/fish/config.fish

临时 vs 永久

命令 临时(当前 session) 永久(写入配置)
alias 直接执行 alias ll 'ls -lah' 写入 ~/.config/fish/config.fish
bind 直接执行 bind \cr history-search-backward 写入 ~/.config/fish/config.fish
1
2
3
4
5
6
7
# 临时:当前终端有效,关闭后失效
alias ll 'ls -lah'
bind \cr history-search-backward

# 永久:写入 ~/.config/fish/config.fish
alias ll 'ls -lah'
bind \cr history-search-backward

写入 config.fish 后每次启动 Fish 会自动加载,无需重复执行。

别名与快捷键的区别

特性 别名 (alias) 快捷键 (bind)
本质 命令的简写/缩写 按键与功能的映射
触发方式 输入完整别名后回车 直接按组合键
适用场景 长命令简化 增强交互体验
参数支持 有限制 完全支持

示例对比:

1
2
3
4
5
# 别名:输入 ll 后等价于 ls -lah
alias ll 'ls -lah'

# 快捷键:按 Ctrl+R 立即触发历史搜索
bind \cr history-search-backward

使用建议:

  • 别名:用于简化常用命令,如 alias gc 'git commit'
  • 快捷键:用于频繁交互操作,如搜索历史、单词跳转、清屏等

二者可以互补使用。